/*
 * @Description: 访问器属性
 * @Author: zzj
 * @Date: 2021-09-07 22:52:58
 * @LastEditors: zzj
 * @LastEditTime: 2021-09-07 23:09:28
 */

var book = {
    _name:'',   // 内置属性
    age:12
  }
  
  Object.defineProperty(book,'name',{
    configurable:true,
    enumerable:true,
    get:function(){
      return this._name;
    },
    set:function(v){
      this._name = "charles "+v
    }
  })
  
  console.log(book);
  book.name = 'terry';
  console.log(book.name)





  
var obj={name:"zs",_age:12}//_age前面的下划线是一种约定，代表属性私有
console.log(obj.name,obj._age,obj.age);//'zs' 12 undefined

//定义的访问器属性Object.defineProperty,在对象是是不存在的属性
Object.defineProperty(obj,"age",{
    get:function(){return this._age;},
    set:function(newage){
        console.log("生日到了，准备礼物...");
        this._age=newage;
        if(newage>18) this.name="ww";//想要的一些操作行为
//Object.defineProperty()定义了访问器属性（age），当age属性修改时,name属性和_age属性会相应修改。
    }
});

console.log(obj.name,obj._age,obj.age);//'zs' 12 12
obj.age=30;
console.log(obj.name,obj._age,obj.age);//ww 30 30

Object.getOwnPropertyDescriptor(obj,"name");  
Object.getOwnPropertyDescriptor(obj,"_age");  
Object.getOwnPropertyDescriptor(obj,"age");  
//enumerable:true
//name--ww
//_age--30
for(var i in obj){
    console.log(i+"--"+obj[i]);
}//enumerable
/*name--ww
_age--30
*/

Object.defineProperty(obj,"age2",{
    get:function(){return this._age;},
    set:function(age){this._age=age;},
    enumerable: true
});

for(var i in obj){
    console.log(i+"--"+obj[i]);
}
/*name--ww
_age--30
age2--30 */

//数据的影响：
obj.age=100;
console.log(obj.age,obj._age);
obj._age=200;
console.log(obj.age,obj._age);